home *** CD-ROM | disk | FTP | other *** search
/ NeXT Education Software Sampler 1992 Fall / NeXT Education Software Sampler 1992 Fall.iso / Programming / Source / IP_Pvc / Pvc_Document.m < prev    next >
Encoding:
Text File  |  1992-07-30  |  6.2 KB  |  266 lines

  1. /* Generated by Interface Builder */
  2.  
  3. #import "Pvc_Document.h"
  4. #import "Pvc_Object.h"
  5. #import <soundkit/Sound.h>
  6. #import <appkit/appkit.h>
  7. #import <cthreads.h>
  8.  
  9. @implementation Pvc_Document
  10.  
  11. #define COMPLAIN 
  12.  
  13. + newFromFile:(char *)path
  14. {
  15.   fprintf(stderr,"Not implemented\n");
  16.   return [self new];
  17. }
  18.  
  19. static any_t runFunc(any_t obj)
  20. {
  21.   [((id)obj) runPvc];
  22.   return 0;
  23. }
  24.  
  25. -checkInputFile
  26. {
  27.   SNDSoundStruct *s;
  28.   if (![pvcObject setInputFilename:(char *)[inputFileNameField stringValue]]){
  29.     NXRunAlertPanel("Pvc","Could not open input file. Check name.",
  30.             "OK",NULL,NULL,NULL);    
  31.     return nil;
  32.   } 
  33.   s = [pvcObject insfh];
  34.   if (s->dataFormat != SND_FORMAT_LINEAR_16 &&
  35.       s->dataFormat != SND_FORMAT_DSP_DATA_16) {
  36.     NXRunAlertPanel("Pvc","Input file must be in 16-bit format. Use mixsounds or RT to convert it.",
  37.             "OK",NULL,NULL,NULL);    
  38.     return nil;
  39.   }
  40.   if (s->channelCount != 1) {
  41.     NXRunAlertPanel("Pvc","Input file must be in mono format. Use extractchannels to extract a channel.  Then run Pvc on each channel.  Finally, merge the channels with mixsounds or RT.",
  42.             "OK",NULL,NULL,NULL);    
  43.     return nil;
  44.   }
  45.   return self;      
  46. }
  47.  
  48. -runFromSender:sender
  49. {
  50.     float     x;
  51.     char msg[1024];
  52.     if ([pvcObject status] != IDLE) {
  53.     int i;
  54.         i = NXRunAlertPanel("Pvc",
  55.                 "You're already computing.  Kill current computation?",
  56.                 "Kill","Continue",NULL,NULL);
  57.     if (i == NX_ALERTDEFAULT) {
  58.         [self killFromSender:self];
  59.         cthread_yield(); /* Let other thread finish. */
  60.     } else if (i == NX_ALERTALTERNATE)
  61.       return nil;
  62.     }
  63.     if (![inputFileNameField stringValue])
  64.         if (![self openSoundFileFromSender:self])
  65.         return nil;
  66.     if (![outputFileNameField stringValue]) 
  67.     if (![self openSoundFileFromSender:self])
  68.         return nil;
  69.     
  70.     [pvcObject setDefaults];
  71.     if (![self checkInputFile])
  72.     return nil;
  73.     [pvcObject setOutputFilename:(char *)[outputFileNameField stringValue]];
  74.  
  75.     [pvcObject N:[FFTsize intValue]];
  76.     [pvcObject Nw:[windowSize intValue]];
  77.     [pvcObject decim:[decimation intValue]];
  78.     [pvcObject interp:[interpolation intValue]];
  79.  
  80.     x = [frequencyMultiplier floatValue];
  81.     [pvcObject freqmlt:x];
  82.     [pvcObject synt:0];       /* Noise gate */
  83.     /* argument checking */
  84.     if (![pvcObject checkArgs:msg]) {
  85.     NXRunAlertPanel("Pvc",msg,"OK",NULL,NULL,NULL);
  86.     return nil;        
  87.     }
  88.     /* allocate NXzone ozone */
  89.     [pvcObject allocateDataspace];
  90.     /* create windows */
  91.     [pvcObject makewindows];
  92.     cthread_detach(cthread_fork(runFunc,(any_t) pvcObject));
  93.     return self;
  94. }
  95.  
  96. -setInterpolationFromSender:sender {return self;}
  97. -setDecimationFromSender:sender {return self;}
  98. -setFFTsizeFromSender:sender {return self;}
  99. -setWindowFromSender:sender {return self;}
  100. -setFrequencyFromSender:sender {return self;}
  101.  
  102. static BOOL getOpenPath(char *buf, char const *theType)
  103. {
  104.     static id    openPanel = nil;
  105.     char const *fileTypes[2] = {0,0};
  106.  
  107.     if (!openPanel)
  108.         openPanel = [OpenPanel new];
  109.     if (theType && *theType)
  110.     fileTypes[0] = theType;
  111.     [NXApp setAutoupdate:NO];
  112.     if ([openPanel runModalForTypes:fileTypes]) {
  113.     strcpy(buf,[openPanel filename]);
  114.     [NXApp setAutoupdate:YES];
  115.     return YES;
  116.     } else {
  117.     [NXApp setAutoupdate:YES];
  118.     return NO;
  119.     }
  120. }
  121.  
  122. static BOOL getSavePath(char *buf, char const *defaultPath)
  123. {
  124.     static id    savePanel = nil;
  125.     BOOL    ok;
  126.     char    dirName[1024], fileName[256];
  127.  
  128.     if (!savePanel) {
  129.         const char *const types[2] = {"snd", NULL};
  130.     
  131.         savePanel = [SavePanel new];
  132.         [savePanel setRequiredFileType:types[0]];
  133.     }
  134.     [NXApp setAutoupdate:NO];
  135.     if (defaultPath && *defaultPath) {
  136.     char *p;
  137.     strcpy(dirName,defaultPath);
  138.     if (p = rindex(dirName,'/')) {
  139.         strcpy(fileName, p+1);
  140.         *p = '\0';
  141.     } else {
  142.         strcpy(fileName,defaultPath);
  143.         fileName[0] = '\0';
  144.     }
  145.     ok = [savePanel runModalForDirectory:dirName file:fileName];
  146.     } else 
  147.     ok = [savePanel runModal];
  148.     [NXApp setAutoupdate:YES];
  149.     if (ok) {
  150.     strcpy(buf,[savePanel filename]);
  151.     return YES;
  152.     } else 
  153.     return NO;
  154. }
  155.  
  156. static DPSTimedEntryProc updateStatus( 
  157.     DPSTimedEntry te,
  158.     double now,
  159.     void *userData )
  160. {
  161.     Pvc_Document *self;    
  162.     self = userData;
  163.     if (self->pvcObject) {
  164.         if ([self->pvcObject status] == IDLE) {
  165.             [self->statusField setStringValue:"done"];
  166.             [self->window display];
  167.         } else {
  168.         char msg[1024];
  169.         sprintf(msg,"running: %d%% computed",(int)([self->pvcObject howFar] * 100)); 
  170.             [self->statusField setStringValue:msg];
  171.         }
  172.     }
  173.     return 0;
  174. }
  175.  
  176. - initFromFile:(const char *)file
  177. {
  178.     [super init];
  179.     [NXApp loadNibSection:"Pvc_Document.nib" owner:self withNames:NO 
  180.      fromZone:[self zone]];
  181.     if (!file) 
  182.       file = "untitled doc";
  183.     [window setTitleAsFilename:file];
  184.     pvcObject = [ [Pvc_Object alloc] init];
  185.     [window makeKeyAndOrderFront:self];
  186.     myTimedEntry = DPSAddTimedEntry(3.0,updateStatus,(int)self, 
  187.                         NX_BASETHRESHOLD);
  188.     return self;
  189. }
  190.  
  191. - init 
  192. {
  193.     [self initFromFile:NULL]; 
  194.     return self;
  195.   }
  196.  
  197. - openSoundFileFromSender:sender
  198. {
  199.     char pathname[1024];
  200.     if (getOpenPath(pathname,"snd"))
  201.       [inputFileNameField setStringValue:pathname];
  202.     else return nil;
  203.     return self;
  204. }
  205.  
  206. - setOutputSoundFileFromSender:sender
  207. {
  208.     char pathname[1024];
  209.     if (getSavePath(pathname,[sender stringValue])) {
  210.       [outputFileNameField setStringValue:pathname];
  211.     }
  212.     else return nil;
  213.     return self;
  214. }
  215.  
  216. -playInputFromSender:sender 
  217. {
  218.   if (![self checkInputFile])
  219.     return nil;
  220.   SNDStartPlaying([pvcObject insfh],1,0, 1, NULL, NULL);
  221.   return self;
  222. }
  223.  
  224. -playOutputFromSender:sender 
  225. {
  226.   SNDStartPlaying([pvcObject outsfh],1,0, 1, NULL, NULL);
  227.   return self;
  228. }
  229.  
  230. -stopPlaying:sender
  231. {
  232.   SNDStop(1);
  233.   return self;
  234. }
  235.  
  236. -killFromSender:sender {
  237.   if ([pvcObject status] != IDLE) {
  238.     [pvcObject kill];
  239.     [statusField setStringValue:"aborted"];
  240.   }
  241.   else NXRunAlertPanel("Pvc","Not computing.","OK",NULL,NULL,NULL);
  242.   return self;
  243. }
  244.  
  245. -pauseFromSender:sender {
  246.   if ([pvcObject status] == PAUSED) {
  247.     [(Pvc_Object *)pvcObject resume];
  248.     [statusField setStringValue:"running"];
  249.  
  250.   }
  251.   else if ([pvcObject status] != IDLE) {
  252.       [(Pvc_Object *)pvcObject pause];
  253.         [statusField setStringValue:"paused"];
  254.   }
  255.   else {
  256.       NXRunAlertPanel("Pvc","Not computing.","OK",NULL,NULL,NULL);
  257.     [sender setState:0];
  258.   }
  259.   return self;
  260. }
  261.  
  262.  
  263.  
  264. @end
  265.  
  266.